#include <stdio.h>  // 标准输入输出头文件，用于printf函数
#include <cuda.h>   // CUDA运行时API头文件，提供GPU编程接口


__device__ void helloFromGPUDevice()
{
    // 修正输出标识：从GPU打印（原代码误标为CPU）
    // threadIdx.x 表示当前线程在块内的索引（0~15）
    printf("Hello, World! Device from GPU####### %d\n", threadIdx.x);  // 每个GPU线程执行打印
}
// CUDA核函数定义（__global__表示在GPU执行的函数）
__global__ void helloFromGPU()
{
    // 修正输出标识：从GPU打印（原代码误标为CPU）
    // threadIdx.x 表示当前线程在块内的索引（0~15）
    printf("Hello, World! from GPU####### %d\n", threadIdx.x);  // 每个GPU线程执行打印
    helloFromGPUDevice();
}//
// CUDA核函数定义（__global__表示在GPU执行的函数）


int main()
{
    // 定义线程块中的线程数量（1个块含16个线程）
    int numThreads = 4;

    // 启动CUDA核函数（<<<块数量, 每块线程数>>>语法）
    helloFromGPU <<<2, numThreads>>>();
    
    // 检查核函数启动错误（保持原代码结构，增加安全性）
    cudaError_t launchErr = cudaGetLastError();
    if (launchErr != cudaSuccess) {
        printf("Kernel launch error: %s\n", cudaGetErrorString(launchErr));
        return -1;
    }

    // 等待GPU执行完成并检查运行时错误（同步主机与设备）
    cudaError_t syncErr = cudaDeviceSynchronize();
    if (syncErr != cudaSuccess) {
        printf("Device sync error: %s\n", cudaGetErrorString(syncErr));
        return -2;
    }

    // 从CPU打印信息（正确标注为CPU）
    printf("Hello, World! from CPU#######\n");

    return 0;  // 显式返回语句（提高代码可读性）
}